package main

import (
	"fmt"
	"time"
)

// producer 函数用于向通道发送数据
// 参数 ch 是一个只能向其中发送数据的通道 (chan<- int)
func producer(ch chan<- int) {
	for i := 0; i < 5; i++ {
		fmt.Printf("生产者产生 %d\n", i)
		ch <- i
	}
	close(ch) // 关闭通道，通知接收方不再有数据发送
}
func consumer2(ch <-chan int) {
	for data := range ch {
		fmt.Printf("消费者消费 %d\n", data)
		time.Sleep(time.Second) // 模拟处理过程，比如网络请求或其他耗时操作
	}
	fmt.Println("通道已关闭。退出消费者。")
}

// consumer 函数用于从通道接收数据
// 参数 ch 是一个只能从其中接收数据的通道 (<-chan int)
func consumer(ch <-chan int) {
	for {
		// 尝试从通道接收数据，同时检查通道是否已经关闭
		data, ok := <-ch
		if !ok {
			fmt.Println("通道已关闭。退出消费者。")
			return
		}
		fmt.Printf("消费者消费 %d\n", data)
		time.Sleep(time.Second) // 模拟处理过程，比如网络请求或其他耗时操作
	}
}

func main() {
	bufferedChannel := make(chan int, 3) // 创建一个大小为3的缓冲区通道

	go producer(bufferedChannel)  // 启动生产者 goroutine
	go consumer2(bufferedChannel) // 启动消费者 goroutine

	time.Sleep(5 * time.Second) // 主函数休眠5秒，确保生产者有足够的时间发送数据
}
